/*
 * Buffer.cpp
 *
 *  Created on: 06/10/2009
 *      Author: hernan
 */

#include "Buffer.h"

Buffer::Buffer() {
}

Buffer::~Buffer() {

}

string Buffer::Read(int pos) {

	string cadena;

	list <NodoBuffer>::iterator it;

	it = buffer.begin();

	while (it != buffer.end())
	{

		if ((*it).offset==pos)
		{

			it->timeStamp = this->GetTimeStamp(); // Actualiza Time Stamp para que no sea limpiado

			cadena= (*it).cadena;

			return cadena;
		}

		it++;

	};

	cadena.clear();

	return ""; // La posicion de OFFSET no existe

}


int Buffer::saveData(string data, int posicion){


	NodoBuffer Nodo;

	Nodo.cadena=data;

	Nodo.indicadorPersistido=false;

	Nodo.offset=posicion;

	Nodo.timeStamp= this->GetTimeStamp();

	buffer.push_front(Nodo);


	return 0;

}

void Buffer::deleteData(int pos)
{

	list <NodoBuffer>::iterator it;

	it = buffer.begin();

	while (it != buffer.end())
	{

		if ((*it).offset==pos)
		{
			it=buffer.erase(it);

			return; // Se elimino el elemento
		}

		it++;

	};

	return; // La posicion no existe

}

void Buffer::clean()
{

	while (!buffer.empty())
	{
		buffer.pop_back();

	};


}
  int Buffer::GetTamanio()
  {

	  return buffer.size();
  }

  time_t Buffer::GetTimeStamp()
  {

	  return time(NULL);

  }

  void Buffer::Limpiar()
  {

	  time_t TiempoDeEspera;
	  time_t segundos;
	  int Elimino=0;

	  segundos=this->GetTimeStamp();

	  TiempoDeEspera=1; // Toda posicion de memoria que este hace 1 SEGUNDO siempre que este persistida se limpiara

	  segundos = segundos - TiempoDeEspera; // SE expresa en minutos, el timpo actual, menos 1 minuto

		list <NodoBuffer>::iterator it;

		it = buffer.begin();


		while (it != buffer.end())
		{
			Elimino=0;

			if ( (((*it).timeStamp)< segundos) && ((*it).indicadorPersistido==true))
			{

				it=buffer.erase(it);
				Elimino=1;
			}

			if (Elimino==0)
			{
			it++;
			}

		};

  }


string Buffer::getData(int position)
{
	string dato;

	dato=this->Read(position);

	return dato;


}

void Buffer::SetPosicion(long int pos)
{



}

void Buffer::updateData(int position, string data) {

	list <NodoBuffer>::iterator it;

	it = buffer.begin();

	while (it != buffer.end())
	{

		if ((*it).offset==position)
		{

			it->offset = this->GetTimeStamp(); // Actualiza Time Stamp para que no sea limpiado

			it->cadena = data;

			it->indicadorPersistido = false;

			return;
		}

		it++;

	};

	return;
}

void Buffer::markPersisted(int position){

	list <NodoBuffer>::iterator it;


	it = buffer.begin();

	while (it != buffer.end())
	{

		if ((*it).offset==position)
		{

			it->indicadorPersistido=true;

			return;
		}

		it++;

	};


	return;

}

int Buffer::getOldData(){

	 time_t TiempoDeEspera;
	 time_t segundos;

	 segundos=this->GetTimeStamp();

	 TiempoDeEspera=1;

	 segundos = segundos - TiempoDeEspera;

	  list <NodoBuffer>::iterator it;

	  it = buffer.begin();

	  while (it != buffer.end()){

		  if ( ((it->timeStamp)< segundos) && (it->indicadorPersistido==false)){

					return it->offset;

			}

			  it++;
	  };

 	if (this->buffer.empty()) return -2;

 	return -1;
}


/*
 *
 *
 *
int Buffer::saveData(Dato *data){
	return 0;
}

void Buffer::updateData(int position, Dato *data){

}

void Buffer::deleteData(int position){

}

Dato *Buffer::getData(int position){
	return NULL;
}
*/
